# encoding='utf-8'
import csv
from py2neo import Graph, Node, Relationship, NodeMatcher, NodeMatcher
import py2neo

'''
创建并初始化知识图谱数据库, 使用neo4j图数据库
创建鱼类基本信息以及其分布地域的图网络
'''


def create_region_kg(graph):
    """
    建立区域(水域)KG
    :param graph:
    :return:
    """
    with open(r'../Data/place.csv', 'r', encoding='utf-8') as f:
        '''
        "place.csv" 
                第一列为区域ID ---> :ID(区域)
                第二列为类型   ---> :LABEL
                第三列为区域名 --->  name
        '''
        reader = csv.reader(f)
        for item in reader:
            # 第一行是标签, 直接跳过
            if reader.line_num == 1:
                continue
            # 打印每个Node内容
            print('当前行数: ', reader.line_num, '当前Node: ', item)
            # 创建Node(三个属性)
            node = Node('Place', id=item[0], place_label=item[1], place_name=item[2])
            # 以覆盖的方式创建节点
            g.merge(node, 'Place', 'id')


def create_fish_info_kg(graph):
    """
    建立鱼类信息KG
    :param graph:
    :return:
    """
    with open('../Data/fish.csv', 'r', encoding='utf-8') as f:
        '''
        "fish.csv"
        :ID(鱼),:LABEL,name,fish_name_en, ... ,bio_introduction
        '''
        reader = csv.reader(f)
        for item in reader:
            # 第一行是标签, 直接跳过
            if reader.line_num == 1:
                continue
            # 打印每个Node内容
            print('当前行数: ', reader.line_num, '当前Node: ', item)
            # 创建Node(24个属性)
            node = Node('Fish', id=item[0], fish_label=item[1], fish_name=item[2], fish_name_en=item[3],
                        fish_img_url=item[4],
                        fish_imgs_url=item[5], bio_kingdom_cn=item[6], bio_kingdom_en=item[7], bio_phylum_cn=item[8],
                        bio_phylum_en=item[9], bio_class_cn=item[10], bio_class_en=item[11], bio_order_cn=item[12],
                        bio_order_en=item[13], bio_family_cn=item[14], bio_family_en=item[15], bio_genus_cn=item[16],
                        bio_genus_en=item[17], bio_is_toxic=item[18], bio_is_economy=item[19], bio_is_food=item[20],
                        bio_is_view=item[21], bio_other_name_url=item[22], bio_introduction=item[23])
            # 以覆盖的方式创建节点
            g.merge(node, 'Fish', 'id')


def create_fish_place_relationship(graph):
    """
    建立鱼类和其生存地域关系
    :param graph:
    :return:
    """
    with open('../Data/fishplacerelationship.csv', 'r', encoding='utf-8') as f:
        '''
        "fishplacerelationship.csv" 
                    第一列为类型    ---> :TYPE
                    第二列为鱼类id  ---> :START_ID(鱼)
                    第三列为区域id  ---> :END_ID(区域)
        '''
        reader = csv.reader(f)
        matcher = NodeMatcher(g)
        for item in reader:
            # 第一行是标签, 直接跳过
            if reader.line_num == 1:
                continue
            # 打印每个item内容
            print('当前行数: ', reader.line_num, '当前Item: ', item)
            # 遍历匹配
            fish_node = matcher.match('Fish').where('_.id=' + "'" + item[1] + "'")
            region_node = matcher.match('Place').where('_.id=' + "'" + item[2] + "'")
            # "多对多关系"
            for fn in fish_node:
                for rn in region_node:
                    g.merge(Relationship(fn, '分布于', rn), '', 'id')


if __name__ == '__main__':
    g = Graph('http://localhost:7474', user='neo4j', password='1008611')
    # create_region_kg(g)
    # create_fish_info_kg(g)
    create_fish_place_relationship(g)
